# @Time : 2020/6/25 10:21
# @Author : Fioman 
# @Phone : 13149920693
"""
标准库中的所有的映射类型都是利用dict来实现的,因此它们有一个共同的限制,即只有可散列的数据类型才能用作这些映射里的键.
什么是可散列的数据类型?
如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__()方法.另外可散列对象还要有
__qe__()方法,这样才能跟其他键做比较.如果两个可散列对象是相等的,那么它们的散列值一定是一样的......
原子不可变数据类型(str,bytes和数值类型)都是可散列类型,frozenset也是可散列的,因为根据其定义,frozenset里只能容纳可散列的类型.元组的话,
只有当一个元组包含的所有元素都是可散列类型的情况下,它才是可散列的.
"""
tt = (1,2,(30,40))
print("hash = {}".format(hash(tt)))
# Python里所有的不可变类型都是可散列的,这句话是不准确的.
# 比如虽然元组本身是不可变序列,它里面的元素可能是其他可变的序列,它就不是可散列的
try:
    t1 = (1,2,[30,40]) # list不是可hash的.
    print("hash = {}".format(hash(t1)))
except Exception as e:
    print(str(e))

tf = (1,2,frozenset([30,40]))
print("hash = {}".format(tf))
